package com.itheima.web;

import com.itheima.common.R;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;

/*
    处理文件上传和下载！
 */
@RestController
public class FileController {

    @Value("${directory}")
    private String directory;

    /**
     * 文件上传
     * @param file
     * @return 保存文件结束之后，要把文件的名字返回给前端。
     */
    @PostMapping("/common/upload")
    public R upload(MultipartFile file) throws IOException {
        //1. 定位保存的文件夹
        File directoryFile = new File(directory);
        if(!directoryFile.exists()){
            directoryFile.mkdirs();
        }

        //2. 获取文件的后缀
        //2.1. 得到原始文件名： 1.jpg
        String originalFilename = file.getOriginalFilename();
        String suffix = originalFilename.substring(originalFilename.lastIndexOf(".")); // .jpg


        //3. 构建新的文件名
        String name = UUID.randomUUID().toString().replaceAll("-", "");
        // 得到文件名：  73e133e8872045cf82b900f37ca42535.jpg
        String fileName = name + suffix;


        //4. 保存文件
        //file.transferTo(new File(directory , fileName));
        file.transferTo(new File(fileName));


        //5. 返回结果
        return R.success(fileName);
    }

    /**
     * 文件下载
     * @param name
     */
    @GetMapping("/common/download")
    public void download(String name , HttpServletResponse response) throws Exception {

        //1. 找到图片，读取成输入流
        FileInputStream fis = new FileInputStream(new File(directory , name));

        //2. 得到输出流对象
        ServletOutputStream os = response.getOutputStream();

        //3. 读取到缓冲区里面，然后不断的把缓冲区的数据写出去！
        //IOUtils.copy(fis, os);

        byte[] buffer = new byte[1024];
        int len = 0 ;
        while( (len = fis.read(buffer)) != -1){
            os.write(buffer , 0 , len);
        }

        fis.close();
    }

}
